﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using static System.Threading.Thread;
using static System.Console;

namespace Project_2
{
    /// <summary>
    /// 2.5 使用 AutoResetEvent 类,从一个线程向另一个线程发送通知
    /// </summary>
    public class Unit_2_05
    {
        public static void Go()
        {
            var t=new Thread(()=>Process(10));
            t.Start();
            WriteLine("等待另一个线程完成工作");
            _workerEvent.WaitOne();
            WriteLine("第一个操作已经完成");
            WriteLine("在主线程中执行一个操作");
            Sleep(TimeSpan.FromSeconds(5));
            _mainEvent.Set();
            WriteLine("现在在第二个线程上运行第二个操作");
            _workerEvent.WaitOne();
            WriteLine("第二个操作已经完成");
        }

        private static AutoResetEvent _workerEvent=new AutoResetEvent(false);
        private static AutoResetEvent _mainEvent=new AutoResetEvent(false);

        static void Process(int seconds)
        {
            WriteLine("开始一个长期运行的工作...");
            Sleep(TimeSpan.FromSeconds(seconds));
            WriteLine("工作结束");
            _workerEvent.Set();
            WriteLine("等待主线程完成其工作");
            _mainEvent.WaitOne();
            WriteLine("开始第二个操作");
            Sleep(TimeSpan.FromSeconds(seconds));
            WriteLine("工作结束");
            _workerEvent.Set();
        }
    }
}
